/* 
 * File:   structures.h
 * Author: stoppy
 * vecchio file structures.h
 * Created on 17 marzo 2009, 10.02
 */
#include <glib-2.0/glib/glist.h>
#include <glib-2.0/glib/gthread.h>
#include <netinet/in.h>
#include <time.h>
#ifndef _STRUCTURES_H
#define	_STRUCTURES_H

#ifdef	__cplusplus
extern "C" {
#endif

    /*
     * rappresenta il superpeer
     */
    struct SUPER_PEER {
        //indirizzo ip
        char addr[INET_ADDRSTRLEN];
        //porta
        int port;
        //carico
        int load;
        //disponibilità
        float ava;
        //hash superpeer
        char hash[33];
    };

    /*
     * struttura che rappresenta il peer
     */
    struct PEER {
        // indirizzo ip
        char addr[INET_ADDRSTRLEN];
        // porta
        int port;
        // carico
        int load;
        // disponibilità
        float ava;
    };

    /*
     *rappresenta il modo in cui viene rappresentato un chunk all'interno del sp
     */
    struct CHUNK_IN_SUPER_PEER {
        //hash del chunk
        char ID[33];
        // rappresenta la posizione del file
        int positionInFile;
        //dimensione del chunk
        int size;
        // lista di puntatoi a peer che possiedono solo il chunk e non l'intero file
        GList *partialPossessorsPeers;
        // lock per bloccare la lista dei possessori parziali
        GStaticRWLock partialPossessorLock;
    };

    /*
     * rappresenta il modo in cui viene rappresentato un file all' interno del sp
     */
    struct FILE_IN_SUPER_PEER {
        // hash del file
        char ID[33];
        // nome del file
        char name[100];
        //numero di chunk che compongono il file
        long chunksNumber;
        // lista di peer che posseggono l' intero file
        GList *completePossessorsPeer;
        // lista di chunk che compongono il file
        GList *chunkInSuperPeer;
        // lock per bloccare la lista dei possessori completi
        GStaticRWLock completePossessorLock;
         // lock per bloccare la lista dei chunk
        GStaticRWLock chunkListLock;
    };

    /*
     * Struttura di definizione del chunk
     * con i relativi dati.
     */
    struct chunk{
        
        char ID[33];

        char IDF[33];

        size_t size;
        
        char chk[10240];

    };

    /*
     * Struttura che conta i chunk presenti
     * la variabile increment puo' essere quindi
     * aumentata (+) o diminuita (-)
     */

    struct chunkIncrement{
        char ID[33];
        int increment; //puo' essere positivo o negativo
    };

    
    /*
     * Struttura chunk ridotta
     */
    
    struct chunkLight{
        char ID[33];
        char IDF[33];
    };
    
    struct peerLight{
        char addr[32];
        int port;
    };
    //utilizzata per effettuare il routing dal peer
    //è gestita da una GList
    struct elemRouting{

        struct peerLight *pl;

        float distance;

        int chunkPosseduti;

    };
    

    struct elemCache{

        struct peerLight * plc;

        float distance;

        time_t timeout;

    };
    

#ifdef	__cplusplus
}
#endif

#endif	/* _STRUCTURES_H */

